package cn.itcast.service.impl;

import cn.itcast.dao.AreaDao;
import cn.itcast.dao.CourierDao;

import cn.itcast.domain.Area;
import cn.itcast.domain.Courier;

import cn.itcast.domain.Standard;
import cn.itcast.service.CourierService;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;


@Service
public class CourierServiceImpl implements CourierService{
    //注入dao
    @Autowired
    private CourierDao courierDao;
    //注入DAO
    private AreaDao areaDao;
    /**
     *添加
     * @param courier
     */
    @Override
    @Transactional
    public void save(Courier courier) {
      courierDao.save(courier);
    }

    /**
     * 分页查询
     * @param page
     * @param rows
     * @return
     */
    @Override
    public Page<Courier> courierpageQuery(Courier courier, int page, int rows) {
        //根据查询条件,构造Specification条件查询对象
        Specification<Courier> specification = new Specification<Courier>() {
            /**
             * 构造条件查询方法,如果方法返回null 代表无条件查询
             * Root 参数 获取条件表达式
             * CriteriaQuery 参数 构造简单查询条件返回,提供where方法
             * CriteriaBuilder 参数 构造Predicate对象,条件对象,构造复杂查询效果
             */
            @Override
            public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //将查询到的结果放到集合中
                List<Predicate> list = new ArrayList<Predicate>();

                //单表查询(查询当前对象对应的数据表),查询工号,等值查询
                if (StringUtils.isNotBlank(courier.getCourierNum())) {
                    Predicate p1 = criteriaBuilder.equal(root.get("courierNum").as(String.class), courier.getCourierNum());
                    list.add(p1);
                }
                if (StringUtils.isNotBlank(courier.getCompany())) {
                    //查询所属单位,模糊查询
                    Predicate p2 = criteriaBuilder.like(root.get("company").as(String.class), "%" + courier.getCompany() + "%");
                    list.add(p2);
                }
                if (StringUtils.isNotBlank(courier.getType())) {
                    //查询类型,等值查询
                    Predicate p3 = criteriaBuilder.equal(root.get("type").as(String.class), courier.getType());
                    list.add(p3);
                }
                //多表查询,查询标准
                Join<Courier, Standard> standardRoot = root.join("standard", JoinType.INNER);
                if (courier.getStandard() != null && StringUtils.isNotBlank(courier.getStandard().getName())) {
                    //进行模糊查询
                    Predicate p4 = criteriaBuilder.like(standardRoot.get("name").as(String.class),
                            "%" + courier.getStandard().getName() + "%");
                    list.add(p4);
                }
                //new Predicate[0] 代表一个泛型,返回类型是Predicate
                return criteriaBuilder.and(list.toArray(new Predicate[0]));

            }
        };
        //调用Spring的方法
        PageRequest pageRequest = PageRequest.of(page - 1, rows);
        Page<Courier> courierPage = courierDao.findAll(specification, pageRequest);
        return courierPage;
    }
        /**
         * 作废
         * @param ids
         */
        @Override
        @Transactional
        public void batchDel (String[]ids){
            for (String id : ids) {
                courierDao.updateDelTagById(Integer.parseInt(id));
            }
        }

        /**
         * 还原
         * @param ids
         */
        @Override
        @Transactional
        public void uptateById (String[]ids){
            for (String id : ids) {
                courierDao.updateById(Integer.parseInt(id));
            }
        }

        //导入城市的保存
    @Override
    public void saveBatch(List<Area> area) {
            areaDao.saveAll(area);

    }
}